//
//  BaseModel.swift
//  Intersection
//
//  Created by 好东家 on 2022/8/30.
//

import UIKit
//import HandyJSON
import SmartCodable


// MARK: - SmartCodable

extension SmartDecodable {
    
    /// JSON 字典转 Model
    public static func toModel(dictionary: [String: Any]?) -> Self? {
        guard dictionary != nil else {
            debugLog("\( String(describing:Self.self) )模型转换传入数据为空")
            return nil
        }
        if (dictionary?.keys.count ?? 0) < 1 {
            return nil
        }
        guard let model = Self.deserialize(from: dictionary) else {
            let errorString = "\( String(describing:Self.self) )模型转换失败!"
            debugLog(errorString)
            return nil
        }
        return model
    }
    
}

extension SmartEncodable {
    ///model数组转json字符串
    public func toJsonString() -> String{
        self.toJSONString() ?? ""
    }
    
    ///model转字典
    public func toDictionary(useMappedKeys: Bool = false) -> [String:Any]{
        self.toDictionary(useMappedKeys: useMappedKeys) ?? [:]
    }
}






///结构体协议
protocol SmartCodableModel: SmartCodable {
    
    ///json转model
    static func toModel(dictionary:[String:Any]?) -> Self
    
    ///model数组转json字符串
    func toJsonString() -> String
    
    ///model转字典
    func toDictionary() -> [String:Any]
    
}

extension Array where Element: SmartCodable {
    
    ///将json转model数组
    public static func toModels(json:[Any]?) -> [Element]{
        
        if json == nil {
            return []
        }
        
        return Self.deserialize(from: json) ?? []
        
//        guard let mods = Self.deserialize(from: json) else {
//            print("解析失败")
//            return []
//        }
//        print(Element.self)
//        return mods
//        return Self.deserialize(from: json) as? Element
    }
    
    ///model数组转json字符串
    public func toJsonString() -> String{
        self.toJSONString() ?? ""
    }
    
    ///model数组转字典数组
    public func toDictionarys() -> [[String:Any]?]{
        return self.map{ mod in
            return mod.toDictionary()
        }
    }
    
}






// MARK: - HandyJSON 放弃

//public class BaseModel: HandyJSON {
//    
////    enum BaseModelError: Error {
////        case error(String)
////    }
//    
//    required init(){}
//    
//    public func mapping(mapper: HelpingMapper) {
////        // 把id转换为json数据里的key：cat_id，friendName转化为读json数据里的friend字典中的name字段。
////        mapper <<< self.id <-- "cat_id"
////        mapper <<< self.friendName <-- "friend.name"
//    }
//    
//    ///json转model
//    public static func toModel(dictionary:[String:Any]?) -> Self{
//        guard let model = Self.deserialize(from: dictionary) else {
//            let errorString = "\(NSStringFromClass(self))模型转换失败!或传入数据为空"
//            print(errorString)
////            throw BaseModelError.error(errorString)
//            return Self.init()
//        }
//        return model
//    }
//    
//    ///model数组转json字符串
//    public func toJsonString() -> String{
//        self.toJSONString() ?? ""
//    }
//    
//    ///model转字典
//    public func toDictionary() -> [String:Any]{
//        self.toJSON() ?? [:]
//    }
//    
//}
//
//extension Array where Element: BaseModel {
//    
//    ///将json转model数组
//    public static func toModels(jsons:[Any]?) -> [Element]{
//        return Self.deserialize(from: jsons) as? [Element] ?? []
//    }
//    
//    ///model数组转json字符串
//    public func toJsonString() -> String{
//        self.toJSONString() ?? ""
//    }
//    
//    ///model数组转字典数组
//    public func toDictionarys() -> [[String:Any]?]{
//        self.toJSON()
//    }
//    
//}
//
//
//
//
//
//// MARK: - HandyJSON结构体协议
/////结构体协议
//public protocol BaseStruct: HandyJSON {
//    
//    ///json转model
//    public static func toModel(dictionary:[String:Any]?) -> Self
//    
//    ///model数组转json字符串
//    public func toJsonString() -> String
//    
//    ///model转字典
//    public func toDictionary() -> [String:Any]
//    
//}
//
//
//extension BaseStruct{
//    
//    ///json转model
//    public static func toModel(dictionary:[String:Any]?) -> Self{
//        guard let model = Self.deserialize(from: dictionary) else {
//            let errorString = "\(NSStringFromClass(self as! AnyClass))模型转换失败!或传入数据为空"
//            print(errorString)
////            throw BaseModelError.error(errorString)
//            return Self.init()
//        }
//        return model
//    }
//    
//    ///model数组转json字符串
//    public func toJsonString() -> String{
//        self.toJSONString() ?? ""
//    }
//    
//    ///model转字典
//    public func toDictionary() -> [String:Any]{
//        self.toJSON() ?? [:]
//    }
//    
//}
//
//
//
//extension Array where Element: BaseStruct {
//    
//    ///将json转model数组
//    public static func toModels(jsons:[Any]?) -> [Element]{
//        return Self.deserialize(from: jsons) as? [Element] ?? []
//    }
//    
//    ///model数组转json字符串
//    public func toJsonString() -> String{
//        self.toJSONString() ?? ""
//    }
//    
//    ///model数组转字典数组
//    public func toDictionarys() -> [[String:Any]?]{
//        self.toJSON()
//    }
//    
//}


